package com.javadroid.webget;

import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;

import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import com.javadroid.model.CapituloModel;
import com.javadroid.sgbd.CapituloDao;
import com.javadroid.sgbd.EnderecoURLDao;


public class ConnectorSite {
	

	private DateFormat sdf;
	private DateFormat sdfFim;
	private List<CapituloModel> resumosSeparados;
	
	public void atualizaBancoDeDadosDeTodasAsNovelas() {
		
		LambeDicionario dic = new LambeDicionario();

		HashMap<Integer, String> map = buscaUrlAtiva(null);

		for (Entry<Integer, String> entry : map.entrySet()) {
			dic.atualizaURLDeNovelas(entry.getKey(), false);
		}
		HashMap<Integer, String> mapAtualizado = buscaUrlAtiva(null);
		for (Entry<Integer, String> entry : mapAtualizado.entrySet()) {
			if(entry.getValue() != null){
				lambeSite(entry.getValue(), entry.getKey());
			}
		
		}

	}
	
	public void atualizaBancoDeUmaNovela(int id_novela){
		LambeDicionario dic = new LambeDicionario();
		dic.atualizaURLDeNovelas(id_novela, false);
		
		HashMap<Integer, String> map = buscaUrlAtiva(id_novela);
		Entry<Integer, String> jj = map.entrySet().iterator().next();
		lambeSite(jj.getValue(), jj.getKey());
	}
	
	private void lambeSite(String url,int novela) {

		Document doc = null;
		try {
			doc = Jsoup.connect(url).get();
		} catch (IOException e) {
			e.printStackTrace();
		}

		List<String> italicTrash = new ArrayList<String>();
		for (Element element : doc.select("i")) {
			italicTrash.add(element.text());
		}		
		
		Element link = doc.select("div[class=post-body]").first();
		String linkText = link.text();		
		
		for (int i = 0; i < italicTrash.size(); i++) {
			linkText = linkText.replace(italicTrash.get(i), "");
		}
		montaCapitulo(linkText,novela);
	}

	private void montaCapitulo(String tudo, int novela) {
		sdf = new SimpleDateFormat("dd/MM/yyyy");
		sdfFim = new SimpleDateFormat("EEEE, dd/MM/yyyy");
		resumosSeparados = new ArrayList<CapituloModel>();
		
		
		Calendar timeMachine = Calendar.getInstance(); 

		if(timeMachine.get(Calendar.DAY_OF_WEEK) == 1){ //domingo
			timeMachine.add(Calendar.DATE, 1);
		}

		if(timeMachine.get(Calendar.DAY_OF_WEEK) == 7){ //sabado
			timeMachine.add(Calendar.DATE, 2);
		}
				
		timeMachine.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		
		for (int i = 0; i < 6; i++) {
			montaCapitulosParaDao(tudo, novela, timeMachine);
		}

		adicionaNoBanco(resumosSeparados,novela);
		
	}

	private void montaCapitulosParaDao(String tudo, int novela, Calendar timeMachine) {

		CapituloModel model = new CapituloModel();
		
		String dia_vigente;
		String proximo_dia;

		dia_vigente = sdf.format(timeMachine.getTime());
		model.setData_capitulo(getCalendar(dia_vigente));
		model.setId_novela(novela);
		timeMachine.add(Calendar.DATE, 1);
		proximo_dia = sdfFim.format(timeMachine.getTime());

		String temp = StringUtils.substringBetween(tudo, dia_vigente+" - cap.", proximo_dia+" - cap.");
		
		if(temp == null){
			temp = StringUtils.substringBetween(tudo, dia_vigente+" - cap.", "Resumo das Novelas");
		}
		if(temp == null){
			return; // se continuar nulo, é comparação com domingo ou dia que não possui novela disponivel
		}
		
		model.setCapitulo(temp);
		
		String num_capitulo = model.getCapitulo().substring(0,4).replaceAll("\\D+","").trim();
		if(!num_capitulo.equals("")){
			model.setNumCapitulo(new Integer(num_capitulo));
		}
			model.setCapitulo(model.getCapitulo().substring(4).replace("\\D+",""));
			resumosSeparados.add(model);

	}
	
	private void adicionaNoBanco(List<CapituloModel> resumosSeparados,int id_novela) {
		CapituloDao dao = new CapituloDao();
		dao.adicionaListaCapitulos(resumosSeparados, id_novela);
		
	}

	private HashMap<Integer, String> buscaUrlAtiva(Integer id_novela){

		HashMap<Integer, String> mapa = new HashMap<Integer, String>();
		
			EnderecoURLDao dao = new EnderecoURLDao();
			if(id_novela == null){
				mapa = dao.getTodasUrlAtivas();
			}else{
				mapa = dao.getUrlAtivaDaNovela(id_novela);
			}
				
			return mapa;

	}
	
	public Calendar getCalendar(String calendar) {
		Calendar cal = null;
		try {
			String data = calendar;
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			cal = Calendar.getInstance();
			cal.setTime(sdf.parse(data));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return cal;
	}


	
}
